//
//  genericitys.swift
//  swift_ example
//
//  Created by 魏熙美 on 2020/2/22.
//  Copyright © 2020 魏熙美. All rights reserved.
//

import Foundation

// 泛型

// 定义类型并指定泛型
struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

// 协议
protocol SomeProtocol {
    
}

// 定义函数，并指定泛型，并且进行x约束
// 第一个类型形式参数， T ，有一个类型约束要求 T 是 SomeClass 的子类。第二个类型形式参数， U ，有一个类型约束要求 U 遵循 SomeProtocol 协议。
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
    
}

func runGener() {
    var stackOfStrings = Stack<String>()
    stackOfStrings.push("uno")
    stackOfStrings.push("dos")
    stackOfStrings.push("tres")
    stackOfStrings.push("cuatro")
    // the stack now contains 4 strings
}
